package org.tompai.common;

/**
 * Hello world!
 *
 */
public class App {
	public static void main(String[] args) {
		System.out.println("Hello World!");

		System.out.println(doubleToDMS(116.418847));
	}

	/**
	 * 将经纬度转换为度分秒格式
	 * @param du 度数 116.418847
	 * @return 116°25'7.85"
	 */
	public static String doubleToDMS(double du) {
		Integer[] dfmArray = new Integer[3];// [0] 度 ，[1] 分 ,[2] 秒
		try {
			// double dd = Convert.ToDouble(str);
			String str = "" + du;
			int p = str.indexOf(".");
			int dt = Integer.parseInt(str.substring(0, p));
			du = du - dt;
			double M = du * 60;
			int mt = (int) M;
			M = (M - mt) * 60;
			if (Math.abs(M - 60) < 0.001) {
				// 秒精确到小数点后三位，小于0.001向前进位，秒为0，分加1，分为60，度加1
				M = 0;
				mt = mt + 1;
			}
			if (mt == 60) {
				dt = dt + 1;
				mt = 0;
			}
			dfmArray[0] = dt;
			dfmArray[1] = mt;
			dfmArray[2] = (int) Math.round(M);// 四舍五入 小数点前整数进位
		} catch (Exception e) {
			System.out.println("小数格式度转度分秒异常：" + e.getMessage());
		}
		String dmString = dfmArray[0] + "°" + dfmArray[1] + "'" + dfmArray[2] + "\"";
		return dmString;
	}

	/**
	  * 经纬度转换 ，度分秒转度
	  * @param str
	  * @author Cai_YF
	  * @return
	  */
	public static String Dms2D(String jwd) {
		if ((jwd.contains("°"))) {// 如果不为空并且存在度单位
			// 计算前进行数据处理
			jwd = jwd.replace("E", "").replace("N", "").replace(":", "").replace("：", "");
			double d = 0, m = 0, s = 0;
			d = Double.parseDouble(jwd.split("°")[0]);
			// 不同单位的分，可扩展
			if (jwd.contains("′")) {// 正常的′
				m = Double.parseDouble(jwd.split("°")[1].split("′")[0]);
			} else if (jwd.contains("'")) {// 特殊的'
				m = Double.parseDouble(jwd.split("°")[1].split("'")[0]);
			}
			// 不同单位的秒，可扩展
			if (jwd.contains("″")) {// 正常的″
				// 有时候没有分 如：112°10.25″
				s = jwd.contains("′") ? Double.parseDouble(jwd.split("′")[1].split("″")[0])
						: Double.parseDouble(jwd.split("°")[1].split("″")[0]);
			} else if (jwd.contains("''")) {// 特殊的''
				// 有时候没有分 如：112°10.25''
				s = jwd.contains("'") ? Double.parseDouble(jwd.split("'")[1].split("''")[0])
						: Double.parseDouble(jwd.split("°")[1].split("''")[0]);
			}
			jwd = String.valueOf(d + m / 60 + s / 60 / 60);// 计算并转换为string
			// 使用BigDecimal进行加减乘除
			/*BigDecimal bd = new BigDecimal("60");
			BigDecimal d = new BigDecimal(jwd.contains("°")?jwd.split("°")[0]:"0");
			BigDecimal m = new BigDecimal(jwd.contains("′")?jwd.split("°")[1].split("′")[0]:"0");
			BigDecimal s = new BigDecimal(jwd.contains("″")?jwd.split("′")[1].split("″")[0]:"0");
			//divide相除可能会报错（无限循环小数），要设置保留小数点
			jwd = String.valueOf(d.add(m.divide(bd,6,BigDecimal.ROUND_HALF_UP)
			.add(s.divide(bd.multiply(bd),6,BigDecimal.ROUND_HALF_UP))));*/
		}
		return jwd;
	}
	
	/*
	 * 在数学中，表示角度的度、分、秒分别使用°、′、″符号进行表示。

       1°=60′，1′=60″ ，1°=3600″。

由上述可知度分秒转换度的计算公式为：(dd°mm′ss″) dd+mm/60+ss/3600

如：

113°30′10.25″ = 113+30/60+10.25/3600 ≈113.502847
	 */
	public static String DDtoDMS(Double d){
		 
        String[] array=d.toString().split("[.]");
        String degrees=array[0];//得到度

        Double m=Double.parseDouble("0."+array[1])*60;
        String[] array1=m.toString().split("[.]");
        String minutes=array1[0];//得到分

        Double s=Double.parseDouble("0."+array1[1])*60;
        String[] array2=s.toString().split("[.]");
        String seconds=array2[0];//得到秒
        return degrees+"-"+minutes+"-"+seconds;
  }
}
